#include "Mutex.hpp"
// 定义一个抢票小程序，利用多线程抢票
using namespace my_pthread;
int tickets = 1000;
class Mutex_Data
{
public:
    Mutex_Data()
    {
        // 构造Mutex类
        _mutex_data = new Mutex();
    }

    // 获取成员变量
    Mutex *Get()
    {
        return _mutex_data;
    }

    ~Mutex_Data()
    {
        delete _mutex_data;
    }

private:
    Mutex *_mutex_data;
};

// 抢票 (每次操作都加锁)
void *Run(void *arg)
{
    // 获取锁
    Mutex *mutex = static_cast<Mutex *>(arg);

    while (true)
    {
        // 加锁(RAII风格互斥锁 出了代码块自动析构解锁)
        Mutex_Gurda guard(mutex);
        if (tickets > 0)
        {
            // 抢票操作
            usleep(1000);
            std::cout << "剩余票数：" << tickets << std::endl;
            tickets--;
            // // 解锁
            // mutex->Unlock();
        }

        else
        {
            // // 解锁
            // mutex->Unlock();
            break;
        }
    }
    return nullptr;
}
int main()
{
    // 创建多线程
    pthread_t tid = 0;
    std::vector<pthread_t> tids;
    // 创建锁
    Mutex_Data mutex = Mutex_Data();
    for (int i = 0; i < 5; i++)
    {
        int n = pthread_create(&tid, nullptr, Run, (void *)mutex.Get()); // 成功->0 失败->非0
        if (n == 0)
        {
            tids.push_back(tid);
        }

        else
        {
            continue;
        }
    }

    // 等待
    for (auto &e : tids)
    {
        pthread_join(e, nullptr);
    }
    return 0;
}
